package org.farec.tcc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.farec.tcc.modelo.Grupo;
import org.farec.tcc.modelo.Usuario;

public class UsuarioDAO {
	
	private Connection connection;
	
	public UsuarioDAO(Connection connection)
	{
		this.connection = connection;
	}
	
	public void adiciona(Usuario usuario, String nomeResponsavel)
	{

		
		try
		{
			PreparedStatement stmt = null;
			
			stmt = this.connection.prepareStatement("SELECT id from responsavel where nome=?");
			stmt.setString(1, nomeResponsavel);
			ResultSet rs = stmt.executeQuery();
			
			if(rs.next())
			{
				String sql = "INSERT INTO usuario(nome, usuario, senha, grupo, email, area, idresponsavel) VALUES(?,?,?,?,?,?,?)";
				
				stmt = connection.prepareStatement(sql);
				
				//seta os dados
				stmt.setString(1, usuario.getNome());
				stmt.setString(2, usuario.getUsuario());
				stmt.setString(3, usuario.getSenha());
				stmt.setString(4, usuario.getGrupo());
				stmt.setString(5, usuario.getEmail());
				stmt.setString(6, usuario.getArea());
				stmt.setInt(7, rs.getInt("id"));
							
				stmt.execute();
				stmt.close();
			}
			
			else
			{
				String sql = "INSERT INTO usuario(nome, usuario, senha, grupo, email, area) VALUES(?,?,?,?,?,?)";
				
				stmt = connection.prepareStatement(sql);
				
				//seta os dados
				stmt.setString(1, usuario.getNome());
				stmt.setString(2, usuario.getUsuario());
				stmt.setString(3, usuario.getSenha());
				stmt.setString(4, usuario.getGrupo());
				stmt.setString(5, usuario.getEmail());
				stmt.setString(6, usuario.getArea());
							
				stmt.execute();
				stmt.close();
			}
			
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}
	
	public List<Usuario> getLista()
	{
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("SELECT nome,usuario,grupo,email,area from usuario where usuario!='admin' order by nome");
			ResultSet rs = stmt.executeQuery();
			List<Usuario> usuarios = new ArrayList<Usuario>();
			
			while(rs.next())
			{
				//Criando um nova instancia
				Usuario usuario = new Usuario();
				usuario.setNome(rs.getString("nome"));
				usuario.setUsuario(rs.getString("usuario"));
				usuario.setGrupo(rs.getString("grupo"));
				usuario.setEmail(rs.getString("email"));
				usuario.setArea(rs.getString("area"));
								
				//Adicionando objeto a lista
				usuarios.add(usuario);
			}
			
			rs.close();
			stmt.close();
			return usuarios;
			
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		
	}
	
	public void altera(Usuario usuario,String nomeResponsavel)
	{	
		try
		{
			PreparedStatement stmt = null;
			
			stmt = this.connection.prepareStatement("SELECT id from responsavel where nome=?");
			stmt.setString(1, nomeResponsavel);
			ResultSet rs = stmt.executeQuery();
			
			if(rs.next())
			{
				String sql ="BEGIN;" +
						"DELETE from usuario WHERE usuario=?;" +
						"INSERT INTO usuario(nome, usuario, senha, grupo, email, area, idresponsavel) VALUES(?,?,?,?,?,?,?);" +
						"COMMIT;";
				
				stmt = this.connection.prepareStatement(sql);
				
				stmt.setString(1, usuario.getUsuario());
				
				//seta os dados
				stmt.setString(2, usuario.getNome());
				stmt.setString(3, usuario.getUsuario());
				stmt.setString(4, usuario.getSenha());
				stmt.setString(5, usuario.getGrupo());
				stmt.setString(6, usuario.getEmail());
				stmt.setString(7, usuario.getArea());
				stmt.setInt(8, usuario.getIdResponsavel());
				
				stmt.execute();
				stmt.close();
			}
			
			else
			{
				String sql ="BEGIN;" +
						"DELETE from usuario WHERE usuario=?;" +
						"INSERT INTO usuario(nome, usuario, senha, grupo, email, area) VALUES(?,?,?,?,?,?);" +
						"COMMIT;";
				
				stmt = this.connection.prepareStatement(sql);
				
				stmt.setString(1, usuario.getUsuario());
				
				//seta os dados
				stmt.setString(2, usuario.getNome());
				stmt.setString(3, usuario.getUsuario());
				stmt.setString(4, usuario.getSenha());
				stmt.setString(5, usuario.getGrupo());
				stmt.setString(6, usuario.getEmail());
				stmt.setString(7, usuario.getArea());
				
				stmt.execute();
				stmt.close();
			}
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}
	
	public void remove(Usuario usuario)
	{
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("DELETE from usuario where usuario=?");
			stmt.setString(1,usuario.getUsuario());
			stmt.execute();
			stmt.close();
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}

	public boolean existeUsuario(Usuario usuario)
	{
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("SELECT usuario, email, grupo, area from usuario where usuario ILIKE ? and senha=?");
			
			stmt.setString(1, usuario.getUsuario());
			stmt.setString(2, usuario.getSenha());
			
			ResultSet rs = stmt.executeQuery();
			
			if(rs.next())
			{
				usuario.setUsuario(rs.getString("usuario"));
				usuario.setGrupo(rs.getString("grupo"));
				usuario.setAlerta(false);
				usuario.setArea(rs.getString("area"));
				return true;
			}
						
			stmt.close();
			rs.close();
			
			
		}
		catch(Exception e)
		{
			throw new RuntimeException(e);
		}
		return false;
	}
	
	public Usuario existeUsuario_ParaEmail(Usuario usuario)
	{
		
			ResultSet rs;
			try
			{
				PreparedStatement stmt = this.connection.prepareStatement("select usuario,email,senha from usuario where usuario=? and email=?");
				stmt.setString(1, usuario.getUsuario());
				stmt.setString(2, usuario.getEmail());
				rs=stmt.executeQuery();
				
				if(rs.next())
				{
					usuario.setAlerta(true);
				}
				
				else
				{
					usuario.setAlerta(false);
				}
				stmt.close();
				rs.close();
			
			}
			
			catch(SQLException e)
			{
				throw new RuntimeException(e);
			}
			return usuario;

	}

	public Usuario existeUsuario_ParaTrocaSenha(Usuario usuario, String val)
	{
		
			ResultSet rs;
			try
			{
				PreparedStatement stmt = this.connection.prepareStatement("select usuario,senha from usuario where usuario=? and senha=?");
				stmt.setString(1, usuario.getUsuario());
				stmt.setString(2, val);
				rs=stmt.executeQuery();
				
				if(rs.next())
				{
					usuario.setAlerta(true);
				}
				
				else
				{
					usuario.setAlerta(false);
				}
				stmt.close();
				rs.close();
			
			}
			
			catch(SQLException e)
			{
				throw new RuntimeException(e);
			}
			return usuario;

	}

	public Usuario buscaPorUsuario(String user)
	{
		try
		{
			PreparedStatement stmt = null;
			
			stmt = this.connection.prepareStatement("SELECT * from usuario where usuario=?");
			
			stmt.setString(1, user);
			
			ResultSet rs = stmt.executeQuery();
			Usuario usuario = new Usuario();
			if(rs.next())
			{
				
				usuario.setNome(rs.getString("nome"));
				usuario.setUsuario(rs.getString("usuario"));
				usuario.setSenha(rs.getString("senha"));
				usuario.setGrupo(rs.getString("grupo"));
				usuario.setEmail(rs.getString("email"));
				usuario.setArea(rs.getString("area"));
				usuario.setIdResponsavel(rs.getInt("idresponsavel"));
			}
			rs.close();
			stmt.close();
			return usuario;
			
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		
	}

	public Usuario getUsuario(Usuario usuario)
	{
		ResultSet rs;
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("select usuario,senha from usuario WHERE usuario ILIKE ? or email ILIKE ?");
			stmt.setString(1, usuario.getUsuario());
			stmt.setString(2, usuario.getEmail());
			
			rs=stmt.executeQuery();
			
			if(rs.next())
			{
				usuario.setAlerta(true);
				usuario.setSenha(rs.getString("senha"));
			}
			
			else
			{
				usuario.setAlerta(false);
			}
			stmt.close();
			rs.close();
		
		}
		
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		return usuario;
		
	}
	
	public Usuario getUsuarioUp(Usuario usuario)
	{
		ResultSet rs;
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("select usuario,senha from usuario WHERE usuario!=? and email ILIKE ?");
			stmt.setString(1, usuario.getUsuario());
			stmt.setString(2, usuario.getEmail());
			
			rs=stmt.executeQuery();
			
			if(rs.next())
			{
				usuario.setAlerta(true);
				usuario.setSenha(rs.getString("senha"));
			}
			
			else
			{
				usuario.setAlerta(false);
			}
			stmt.close();
			rs.close();
		
		}
		
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		return usuario;
		
	}
	
	public List<Usuario> getListaUsuariosDoGrupo(Grupo grupo)
	{
		try
		{
			String sql = "SELECT nome,usuario,grupo FROM usuario WHERE grupo=?"; 
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			
			stmt.setString(1, grupo.getNome());
			
			ResultSet rs = stmt.executeQuery();
		
			List<Usuario> usuarioList = new ArrayList<>();
			
			while(rs.next())
			{
				Usuario user = new Usuario();
				user.setNome(rs.getString("nome"));
				user.setUsuario(rs.getString("usuario"));
				user.setGrupo(rs.getString("grupo"));
				
				usuarioList.add(user);
			}
			
			return usuarioList;	
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}

	public void alteraSenha(Usuario usuario) {
		// TODO Auto-generated method stub
		String sql = "UPDATE usuario SET senha=? where usuario ILIKE ?";
		try
		{		
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setString(1, usuario.getSenha());
			stmt.setString(2, usuario.getUsuario());
	
			stmt.execute();
			stmt.close();
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}

}